home *** CD-ROM | disk | FTP | other *** search
/ Animation How-To / Animation How-to CD.iso / PLY / CHAPTER7 / ASTEROID / PATH3.BAS < prev    next >
BASIC Source File  |  1994-01-01  |  5KB  |  220 lines

  1. ' PATH3.BAS - Asteroid Spline Path Creation Program
  2. '
  3. '  "Magic Spline Fitting Code" translated from the C spline code in
  4. '  INTERACTIVE 3D COMPUTER GRAPHICS by L. Ammeraal,
  5. '  Chichester: John Wiley & Sons. (1988)
  6.  
  7. DECLARE SUB rotate (a!, b!, c!)
  8.  
  9. TYPE vector
  10.   x AS SINGLE
  11.   y AS SINGLE
  12.   z AS SINGLE
  13. END TYPE
  14.  
  15. SCREEN 12
  16. WINDOW (-3.2, -2.4)-(3.2, 2.4)
  17.  
  18. LINE (-1, -1)-(1, 1), , B
  19.  
  20. ' left to right tunnels
  21. s = 8
  22. b = 1
  23.  
  24. LINE (-4, -4)-(4, 4), , B
  25.  
  26. ' The individual control points.
  27.  
  28. DATA 0.0,   0.0,  16.0
  29. DATA 0.0,   0.0,   8.0
  30. DATA 0.0,   0.0,   4.0
  31. DATA 0.0,   0.0,   2.0
  32. DATA 0.0,   0.0,   1.5
  33. DATA 0.1,   0.0,   1.0
  34. DATA 0.0,   0.0,   0.5
  35. DATA 0.5,   0.5,   0.5
  36. DATA 0.0,   0.75,  0.0
  37. DATA 0.5,   0.5,  -0.5
  38. DATA 0.75,  0.0,   0.0
  39. DATA 0.5,  -0.5,  -0.5
  40. DATA 0.0,   0.0,  -0.75
  41. DATA-0.5,  -0.5,  -0.5
  42. DATA-0.75,  0.0,   0.0
  43. DATA-0.5,   0.5,  -0.5
  44. DATA 0.0,   0.75,  0.0
  45. DATA-0.5,   0.5,   0.5
  46. DATA 0.0,   0.0,   0.75
  47. DATA-0.5,  -0.5,   0.5
  48. DATA 0.0,  -0.75,  0.0
  49. DATA 0.5,  -0.5,   0.5
  50. DATA 0.5,   0.0,   0.0
  51. DATA 1.0,   0.0,   0.0
  52. DATA 2.0,   0.0,   0.0
  53. DATA 4.0,   0.0,   0.0
  54. DATA 8.0,   0.0,   0.0
  55. DATA 16.0,  0.0,   0.0
  56. DATA 32.0,  0.0,   0.0
  57.  
  58. m = 29
  59. n = 10
  60. scale = .9
  61. count = 500
  62. ahead = 5
  63.  
  64. DIM x(m), y(m), z(m)
  65. DIM cam(count + ahead) AS vector
  66.  
  67. FOR i = 1 TO m
  68.   READ x(i), y(i), z(i)
  69. NEXT i
  70.  
  71. k = 1
  72. m = 28
  73.  
  74. OPEN "check" FOR OUTPUT AS #2
  75.  
  76. FOR i = 2 TO m - 1
  77.        
  78.        ' MAGIC SPLINE FITTING CODE
  79.  
  80.     xA = x(i - 1): xB = x(i): xC = x(i + 1): xD = x(i + 2)
  81.     yA = y(i - 1): yB = y(i): yC = y(i + 1): yD = y(i + 2)
  82.     zA = z(i - 1): zB = z(i): zC = z(i + 1): zD = z(i + 2)
  83.  
  84.     a3 = (-xA + 3! * (xB - xC) + xD) / 6!
  85.     a2 = (xA - 2! * xB + xC) / 2!
  86.     a1 = (xC - xA) / 2!
  87.     a0 = (xA + 4! * xB + xC) / 6!
  88.  
  89.     b3 = (-yA + 3! * (yB - yC) + yD) / 6!
  90.     b2 = (yA - 2! * yB + yC) / 2!
  91.     b1 = (yC - yA) / 2!
  92.     b0 = (yA + 4! * yB + yC) / 6!
  93.  
  94.     c3 = (-zA + 3! * (zB - zC) + zD) / 6!
  95.     c2 = (zA - 2! * zB + zC) / 2!
  96.     c1 = (zC - zA) / 2!
  97.     c0 = (zA + 4! * zB + zC) / 6!
  98.  
  99.     'PRINT USING "< ##.####, ##.####, ##.#### >"; a3; b3; c3
  100.     'PRINT USING "< ##.####, ##.####, ##.#### >"; a2; b2; c2
  101.     'PRINT USING "< ##.####, ##.####, ##.#### >"; a1; b1; c1
  102.     'PRINT USING "< ##.####, ##.####, ##.#### >"; a0; b0; c0
  103.     'PRINT
  104.  
  105.     w = 2
  106.  
  107.     FOR j = first TO n
  108.         t = j / n
  109.         cam(k).x = scale * (((a3 * t + a2) * t + a1) * t + a0)
  110.         cam(k).y = scale * (((b3 * t + b2) * t + b1) * t + b0)
  111.         cam(k).z = scale * (((c3 * t + c2) * t + c1) * t + c0)
  112.  
  113.         PRINT #2, USING "##.##### "; cam(k).x; cam(k).y; cam(k).z
  114.         k = k + 1
  115.         IF j = first THEN
  116.             PSET (x, z), y * 20 + 8
  117.             CIRCLE (x, z), .05, 2
  118.         ELSE
  119.             PSET (x, z), y * 20 + 8
  120.         END IF
  121.     NEXT j
  122.     first = 1
  123. NEXT i
  124. CLOSE #2
  125.  
  126. OPEN "orbiter.bat" FOR OUTPUT AS #1
  127.  
  128. k = 1
  129. frame = 0
  130.  
  131. DO WHILE cam(k).x < 4
  132.   IF cam(k).z < 4 THEN
  133.   frame = frame + 1
  134.   count$ = RIGHT$("0000" + LTRIM$(STR$(frame)), 4)
  135.  
  136.   PRINT #1, USING "echo define frx ##.###### >anim"; cam(k).x
  137.   PRINT #1, USING "echo define fry ##.###### >>anim"; cam(k).y
  138.   PRINT #1, USING "echo define frz ##.###### >>anim"; cam(k).z
  139.  
  140.   up = 1
  141.  
  142.   dimn = 1.5
  143.   norm1 = (frame - 20) / 40
  144.   norm2 = (frame - 190 - 20) / 40
  145.  
  146. '  manually flip "up" to prevent scene reversal
  147.  
  148.   IF frame > 78 AND frame < 119 THEN up = -1
  149.   IF frame > 158 THEN up = -1
  150.   inc = 0
  151.   IF frame < 20 THEN inc = 1
  152.   IF frame > 190 THEN inc = 2
  153.  
  154.   PRINT #1, USING "echo define atx ##.###### >>anim"; cam(k + ahead).x
  155.   PRINT #1, USING "echo define aty ##.###### >>anim"; cam(k + ahead).y
  156.   PRINT #1, USING "echo define atz ##.###### >>anim"; cam(k + ahead).z
  157.  
  158.   PRINT #1, USING "echo define upx ##.###### >>anim"; 0!
  159.   PRINT #1, USING "echo define upy ##.###### >>anim"; up
  160.   PRINT #1, USING "echo define upz ##.###### >>anim"; 0!
  161.  
  162.   PRINT #1, USING "echo define inc # >>anim"; inc
  163.  
  164.     PRINT #1, "\ply\polyray astr2.pi -o astr"; count$; ".tga "
  165.     PRINT #1,
  166.  
  167.     a = cam(k).x
  168.     b = cam(k).y
  169.     c = cam(k).z
  170.  
  171.     CALL rotate(a, b, c)
  172.  
  173.     d = cam(k + ahead).x
  174.     e = cam(k + ahead).y
  175.     f = cam(k + ahead).z
  176.  
  177.     CALL rotate(d, e, f)
  178.  
  179.     ' show it
  180.  
  181.     LINE (a, c)-(d, f), 1 + co MOD 14
  182.     co = co + 1
  183.     END IF
  184.     k = k + 1
  185. LOOP
  186.  
  187. CLOSE #1
  188.  
  189. SUB rotate (a, b, c)
  190. pi = 3.14159
  191. rad = pi / 180
  192.  
  193. 'rotate
  194.      xrotate = 30
  195.      yrotate = 45
  196.      zrotate = 0
  197.  
  198.      x0 = a
  199.      y0 = b
  200.      z0 = c
  201.  
  202.      x1 = x0
  203.      y1 = y0 * COS(xrotate * rad) - z0 * SIN(xrotate * rad)
  204.      z1 = y0 * SIN(xrotate * rad) + z0 * COS(xrotate * rad)
  205.     
  206.      x2 = z1 * SIN(yrotate * rad) + x1 * COS(yrotate * rad)
  207.      y2 = y1
  208.      z2 = z1 * COS(yrotate * rad) - x1 * SIN(yrotate * rad)
  209.     
  210.      x3 = x2 * COS(zrotate * rad) - y2 * SIN(zrotate * rad)
  211.      y3 = x2 * SIN(zrotate * rad) + y2 * COS(zrotate * rad)
  212.      z3 = z2
  213.  
  214.      a = x3
  215.      b = y3
  216.      c = z3
  217.  
  218. END SUB
  219.  
  220.